//package com.moyun.websocket.controller;
//
//import com.alibaba.fastjson.JSON;
//import com.moyun.websocket.entity.Greeting;
//import com.moyun.websocket.entity.HelloMessage;
//import com.moyun.websocket.interceptor.WebSocketUserAuthentication;
//import lombok.RequiredArgsConstructor;
//import lombok.extern.java.Log;
//import org.springframework.messaging.handler.annotation.DestinationVariable;
//import org.springframework.messaging.handler.annotation.MessageMapping;
//import org.springframework.messaging.handler.annotation.SendTo;
//import org.springframework.messaging.simp.SimpMessagingTemplate;
//import org.springframework.messaging.simp.annotation.SendToUser;
//import org.springframework.messaging.simp.stomp.StompHeaderAccessor;
//import org.springframework.scheduling.annotation.Scheduled;
//import org.springframework.stereotype.Controller;
//
//import java.util.HashMap;
//import java.util.Map;
//
///**
// * @ClassName GreetingController
// * @Description Websocket 服务端消息处理器(使用说明模板)
// * @Author yangboxuan
// * @Date 2021/6/25 20:49
// */
//@Slf4j
//@Controller
//@RequiredArgsConstructor
//public class WSTemplateController {
//
//    private final SimpMessagingTemplate messagingTemplate;
//
//    /**
//     * @return com.moyun.websocket.entity.Greeting
//     * @Author yangboxuan
//     * @Description @MessageMapping("/hello") 注解是确保 如果一个消息 发送到 /hello 目的地，greeting()方法被调用
//     * 消息的有效负载绑定到一个 HelloMessage 对象，该对象被传递到 greeting()
//     * greeting() 方法创建一个 Greeting 对象并返回它。返回值将广播给 /topic/greetings 的所有订阅者。如@SendTo 注释中所指定。请注意，输入消息中的名称已被清理，因为在这种情况下，它将被回显并在客户端的浏览器 DOM 中重新呈现。
//     * @Date 2021/6/24 19:20
//     * @Param [message]
//     **/
//    @MessageMapping("/hello")
//    @SendTo("/topic/hello")
////    @Scheduled(cron = "*/2 * * * * ?")
//    public void greeting() throws Exception {
//        System.out.println("Hello !");
//        HashMap<String, Object> map = new HashMap<>();
//        map.put("name", "杨渤璇");
//        map.put("age", 18);
//
//        try {
//            messagingTemplate.convertAndSend("/topic/hello",map);
//        } catch (Exception e) {
//            System.out.println(e);
//        }
////            return new Greeting("Hello !");
//    }
//
//    /**
//     * @SendTo定义了消息的目的地。结合例子解释就是“接收/change-notice发来的value，然后将value转发到/topic/notice客户端。 /topic/notice是客户端发起连接后，订阅服务端消息时指定的一个地址，用于接收服务端的返回。
//     */
//
//    @MessageMapping("/change-notice")
//    @SendTo("/topic/notice")
//    public String greeting2(String value) {
//        return value;
//    }
//
//    /**
//     * 根据ID 把消息推送给指定用户
//     * 1. 这里用了 @SendToUser 和 返回值 其意义是可以在发送成功后回执给发送放其信息发送成功
//     * 2. 非必须，如果实际业务不需要关心此，可以不用@SendToUser注解，方法返回值为void
//     * 3. 这里接收人的参数是用restful风格带过来了，websocket把参数带到后台的方式很多，除了url路径，
//     * 还可以在header中封装用@Header或者@Headers去取等多种方式
//     *
//     * @param accountId      消息接收人ID
//     * @param json           消息JSON字符串
//     * @param headerAccessor
//     * @return
//     */
//    @MessageMapping("/sendChatMsgById/{accountId}")
//    @SendToUser(value = "/userTest/callBack")
//    public Map<String, Object> sendChatMsgById(
//            @DestinationVariable(value = "accountId") String accountId, String json,
//            StompHeaderAccessor headerAccessor) {
//
//        Map msg = (Map) JSON.parse(json);
//        Map<String, Object> data = new HashMap<String, Object>();
//
//        // 这里拿到的user对象是在WebSocketChannelInterceptor拦截器中绑定上的对象
//        WebSocketUserAuthentication user = (WebSocketUserAuthentication) headerAccessor.getUser();
//
//        log.info("SendToUser controller 中获取用户登录令牌：" + user.getName()
//                + " socketId:" + headerAccessor.getSessionId());
//
//        // 向用户发送消息,第一个参数是接收人、第二个参数是浏览器订阅的地址，第三个是消息本身
//        // 如果服务端要将消息发送给特定的某一个用户，
//        // 可以使用SimpleMessageTemplate的convertAndSendToUser方法(第一个参数是用户的登陆名username)
//        String address = "/userTest/callBack";
//        messagingTemplate.convertAndSendToUser(accountId, address, msg.get("msg"));
//
//        data.put("msg", "callBack 消息已推送，消息内容：" + msg.get("msg"));
//        return data;
//    }
//
//}